GraphQL 基础

1. 什么是 GraphQL?

GraphQL 是一种用于 API 的查询语言,它允许客户端精确地请求所需的数据,而不是服务器返回固定的数据结构。GraphQL 由 Facebook 开发,并于 2015 年开源。与传统的 REST API 相比,GraphQL 提供了更灵活、高效的数据获取方式。

1.1 GraphQL 与 REST 的区别

  • REST API: 服务器定义了多个端点(endpoints),每个端点返回固定的数据结构。客户端必须请求多个端点以获取所需的所有数据。
  • GraphQL: 客户端通过一个单一的端点发送查询请求,查询中定义了所需的数据结构。服务器根据查询返回精确的数据。

2. GraphQL 的核心概念

2.1 查询(Query)

查询是客户端向服务器请求数据的指令。查询定义了客户端需要的数据结构。

query {
  user(id: "1") {
    name
    email
  }
}

2.2 变异(Mutation)

变异用于修改服务器上的数据,例如创建、更新或删除数据。

mutation {
  createUser(name: "John Doe", email: "[email protected]") {
    id
    name
    email
  }
}

2.3 订阅(Subscription)

订阅用于实时获取数据更新。当服务器上的数据发生变化时,客户端会自动接收到更新。

subscription {
  userCreated {
    id
    name
    email
  }
}

3. GraphQL 的类型系统

GraphQL 使用强类型系统来定义数据结构。常见的类型包括:

  • 标量类型: Int, Float, String, Boolean, ID
  • 对象类型: 包含多个字段的对象
  • 接口: 定义一组字段,多个对象类型可以实现该接口
  • 联合类型: 表示多个对象类型的联合
type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}

4. 实践练习:创建一个简单的 GraphQL 服务器

4.1 安装依赖

首先,我们需要安装 express 和 express-graphql 包。

npm install express express-graphql graphql

4.2 创建服务器

创建一个简单的 Express 服务器,并使用 express-graphql 中间件来处理 GraphQL 请求。

const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');

// 定义 GraphQL 模式
const schema = buildSchema(`
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    user(id: ID!): User
  }
`);

// 模拟用户数据
const users = [
  { id: '1', name: 'John Doe', email: '[email protected]' },
  { id: '2', name: 'Jane Doe', email: '[email protected]' },
];

// 定义解析器
const root = {
  user: ({ id }) => users.find(user => user.id === id),
};

// 创建 Express 服务器
const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true, // 启用 GraphiQL 工具
}));

app.listen(4000, () => {
  console.log('GraphQL server running at http://localhost:4000/graphql');
});

4.3 运行服务器

启动服务器:

node server.js

访问 http://localhost:4000/graphql,你将看到 GraphiQL 工具,可以在其中编写和测试 GraphQL 查询。

5. 实践练习:编写 GraphQL 查询

在 GraphiQL 中编写以下查询:

query {
  user(id: "1") {
    name
    email
  }
}

你应该会看到以下响应:

{
  "data": {
    "user": {
      "name": "John Doe",
      "email": "[email protected]"
    }
  }
}

6. 总结

GraphQL 提供了一种更灵活、高效的数据获取方式,允许客户端精确地请求所需的数据。通过本教程,你已经学习了 GraphQL 的核心概念,并创建了一个简单的 GraphQL 服务器。继续探索 GraphQL 的更多功能,如变异和订阅,以及如何在实际项目中应用它。

7. 进一步学习资源

通过这些资源,你可以深入学习 GraphQL 的高级功能和最佳实践。